package br.com.esporte.view.site.component.partida;

import java.util.List;

import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.Model;

import br.com.esporte.exception.ViewException;
import br.com.esporte.model.Jogador;
import br.com.esporte.model.Partida;
import br.com.esporte.model.Time;
import br.com.esporte.view.infra.component.ComponenteGenerico;
import br.com.esporte.view.site.component.listaTime.TimeComponent;

/**
 * 
 * @author Milton Domingues
 *
 */
public abstract class PartidaComponent extends ComponenteGenerico {

	private static final long serialVersionUID = 119239693657728773L;

	private Partida partida;

	private static final String TIME_1_ID = "time1";
	private static final String TIME_2_ID = "time2";
	private static final String PLACAR_AZUL = "placarAzul";
	private static final String PLACAR_VERMELHO = "placarVermelho";
	private static final String LINK_EDITAR_ID = "linkEditar";

	public PartidaComponent(String id, Partida partida) {
		super(id);
		setPartida(partida);
		carregarView();
		validarView();
		montarComponente();
	}

	public abstract void acaoEditar(Partida partida);

	private Link<Partida> criarLinkEdicao(Partida partida){
		Link<Partida> link = new Link<Partida>(LINK_EDITAR_ID, new Model<Partida>(partida)) {

			private static final long serialVersionUID = 5067755447056700112L;

			@Override
			public void onClick() {
				acaoEditar(getModelObject());
			}
		};
		link.setVisible(habilitarEdicao());
		return link;
	}

	private TimeComponent criarTime(String id, Time time, String color){
		TimeComponent timeComp = new TimeComponent(id, time, color);
		return timeComp;
	}

	public Partida getPartida() {
		return partida;
	}

	public abstract boolean habilitarEdicao();

	@Override
	public void montarComponente() {
		List<Time> times = getPartida().getTimes();
		add(criarLinkEdicao(getPartida()));
		add(criarTime(TIME_1_ID, times.get(0), TimeComponent.COLOR_RED));
		add(criarTime(TIME_2_ID, times.get(1), TimeComponent.COLOR_BLUE));
		add(new Label(PLACAR_VERMELHO, String.valueOf(placarTime(times.get(0)))));
		add(new Label(PLACAR_AZUL, String.valueOf(placarTime(times.get(1)))));
	}

	private int placarTime(Time time){
		int placar = 0;
		for (Jogador jogador : time.getJogadores()) {
			placar += jogador.getPonto();
		}
		return placar;
	}

	public void setPartida(Partida partida) {
		this.partida = partida;
	}

	@Override
	public void validarView() {
		if(getPartida() == null){
			throw new ViewException("Nenhuma partida registrada.");
		}
		if((getPartida().getTimes() == null) || (getPartida().getTimes().size() == 0)){
			throw new ViewException("Nenhum Time registrada.");
		}
	}

}
